package packageController;

import java.io.IOException;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map.Entry;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import packageBusiness.ConnexionManager;
import packageBusiness.PanierManager;
import packageBusiness.ProduitManager;
import packageException.*;
import packageModel.Commande;
import packageModel.Composition;
import packageModel.Utilisateur;

/**
 *
 * @author Lionel & Julien
 */
public class ConnexionSyllatheque extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        // ---------------------------
        // Variable passé en requête
        String pseudo = request.getParameter("pseudo");
        String password = request.getParameter("password");

        // On vérifie avant de faire quoi que ce soit si les paramètres ne sont pas nuls
        // Si c'est le cas, ça ne sert à rien d'aller plus loin, on renvoit une erreur
        // Dans le cas contraire, la connexion peut poursuivre
        if(request.getParameter("pseudo") != null && request.getParameter("password") != null) {
            try {
                // ---------------------------
                // Création de l'utilisateur correspondant aux variables pseudo et password
                HttpSession session = request.getSession();
                
                // Récupération de la HashMap de l'invité !
                HashMap <String, Composition> hashPanierInvite = (HashMap)session.getAttribute("panierInvite");
                
                // Utilisateur
                Utilisateur usr = null;
                ConnexionManager connexion = new ConnexionManager();
                
                // Création de l'utilisateur
                usr = connexion.ConnexionSyllatheque(pseudo, password);
                
                // ---------------------------
                // Création des variables pour la vue
                request.setAttribute("connexion", "Félicitations, vous êtes bien connecté !");
                
                // Est ce que le panier de l'invité est vide ?
                if(!(hashPanierInvite.isEmpty())) {
                    // Le panier de l'invité n'est pas vide, il faut donc l'ajouter à son panier existant !
                    PanierManager cde = new PanierManager();
                    ProduitManager syll = new ProduitManager();
                    Commande ourCde = null;
                    Composition compo = null;
                    
                    int nbCde = cde.getNbCommande(usr.getPseudo());
                    if(nbCde == 1) {
                        // On récupère notre commande !
                        ourCde = cde.lastCommande(usr.getPseudo());
                    } else {
                        // On créé une nouvelle commande !
                        ourCde = cde.insertCommande(
                                                usr.getPseudo(), 
                                                new GregorianCalendar(), 
                                                null, 
                                                false
                                           );
                    }
                    
                    // On boucle sur notre hashMap
                    for(Entry<String, Composition> entree : hashPanierInvite.entrySet()) { 
                        // ---------------------------
                        // Création de la nouvelle composition
                        // Est-ce que le syllabus est déjà dans la commande de l'utilisateur ?
                        Boolean isExist = cde.existComposition(entree.getValue().getSyllabus().getSyllabusId(), usr.getPseudo());

                        if(isExist == true) {
                            // On modifier seulement la quantité
                            compo = cde.modifyQuantity(entree.getValue().getSyllabus().getSyllabusId(), usr.getPseudo(), entree.getValue().getQuantite(), "add");
                        } else {
                            // On peut ajouter le nouveau syllabus
                            double prixSyllabus = syll.getOneSyllabus(entree.getValue().getSyllabus().getSyllabusId()).getPrix();
                            if(syll.getOneSyllabus(entree.getValue().getSyllabus().getSyllabusId()).getReduction() != null) {
                                prixSyllabus = syll.getOneSyllabus(
                                            entree.getValue().getSyllabus().getSyllabusId()).getPrix() - 
                                            (syll.getOneSyllabus(entree.getValue().getSyllabus().getSyllabusId()).getPrix() * 
                                            (syll.getOneSyllabus(entree.getValue().getSyllabus().getSyllabusId()).getReduction().getReduction())/100
                                        );
                            }
                            // Calcul de la réduction si l'utilisateur est professeur
                            if(usr.isIsProf() == true) {
                                prixSyllabus = prixSyllabus - (prixSyllabus * 0.05);
                            }

                            compo = cde.insertComposition( 
                                        ourCde.getNumCde(), 
                                        entree.getValue().getSyllabus().getSyllabusId(), 
                                        entree.getValue().getQuantite(), 
                                        prixSyllabus
                                    );
                        }
                        // On ajoute la nouvelle composition à notre HashMap
                        usr.setHashPanier(entree.getKey(), compo);
                    }
                }

                // Création de la session correspondant à l'utilisateur
                //session.invalidate();
                session = request.getSession();
                session.setAttribute("usr", usr);
                
                // ---------------------------
                // Redirection vers une page pour la vue
                if(!(hashPanierInvite.isEmpty())) {
                    RequestDispatcher rd = request.getRequestDispatcher("recap.jsp");
                    rd.forward(request, response);
                } else {
                    RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
                    rd.forward(request, response);
                }
            } catch(ConnexionException e1) {
                // Erreur
                request.setAttribute("error", e1.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(InvalideDonneesException e2) {
                // Erreur
                request.setAttribute("errorInvalideDonnees", e2.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(CommandeException e3) {
                // Erreur
                request.setAttribute("error", e3.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(CompositionException e4) {
                // Erreur
                request.setAttribute("error", e4.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(SyllabusException e5) {
                // Erreur
                request.setAttribute("error", e5.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(LangueException e6) {
                // Erreur
                request.setAttribute("error", e6.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(AuteurException e7) {
                // Erreur
                request.setAttribute("error", e7.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(CategorieException e8) {
                // Erreur
                request.setAttribute("error", e8.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(PromotionException e9) {
                // Erreur
                request.setAttribute("error", e9.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(ReductionException e10) {
                // Erreur
                request.setAttribute("error", e10.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(MotsClefsException e11) {
                // Erreur
                request.setAttribute("error", e11.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            } catch(DataException e12) {
                // Erreur
                request.setAttribute("error", e12.toString());
                RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
                rd.forward(request, response);
            }
        } else {
            // Erreur
            request.setAttribute("errorLogin", "Impossible de gérer la connexion, votre identifiants et/ou votre password est vide");
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
